package com.imooc.service.impl;

import com.imooc.dataobject.ProductInfo;
import com.imooc.dto.CartDTO;
import com.imooc.enums.ProductStatusEnum;
import com.imooc.enums.ResultEnum;
import com.imooc.exception.SellException;
import com.imooc.repository.ProductInfoRepository;
import com.imooc.service.ProductInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

//这才是正宗的处理服务层---->  之后进行对服务的测试，这里实现
@Service
@Slf4j
public class ProductInfoServiceImpl implements ProductInfoService{

    //private ProductInfoService productInfoService;
    //要对dao层的进行封装，引入他妈的分清楚--目的让服务层封装对数据库代理操作。

    @Autowired
    private ProductInfoRepository repository;

    @Override
//    @CachePut(cacheNames = "product", key = "#productId",
//            condition="#productId.length() > 3" ,
//    unless = "#result.getCode() != 0")
    public ProductInfo findOne(String productId) {
        return repository.findOne(productId);
    }

    @Override
    //这里的分页很有意思，得仔细研究
    public Page<ProductInfo> findAll(Pageable pageable) {

        return repository.findAll(pageable);
    }

    @Override
    public List<ProductInfo> findUpAll() {
//        ProductStatusEnum.UP.getCode()----枚举代替数字，很讲究
        return repository.findByProductStatus(ProductStatusEnum.DOWN.getCode());
    }

    @Override
    public ProductInfo save(ProductInfo productInfo) {
        return repository.save(productInfo);
    }

    @Override
    @Transactional
    public void increaseStock(List<CartDTO> cartDTOList) {
//        根据前端传过来的数据查看数据库中有没有对应的商品
        for(CartDTO cartDTO : cartDTOList){
            ProductInfo productInfo = repository.findOne(cartDTO.getProductId());

            //  没有：报错，
            if(productInfo == null){
                log.error("【产品不存在】，productid={}",cartDTO.getProductId());
                throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
            }

            //        有：计算增加其库存  //  将库存数量设置进去
            productInfo.setProductStock(productInfo.getProductStock() + cartDTO.getProductQuantity());

            repository.save(productInfo);

        }


    }

//    批量操作的都要事务，同成同失败
    @Override
    @Transactional
    public void decreaseStock(List<CartDTO> cartDTOList) {
        //1. 根据前端传来的productId,去数据库商品信息表查询该商品在不在
        for(CartDTO cartDTO : cartDTOList){
            ProductInfo productInfo = repository.findOne(cartDTO.getProductId());

            //2.如果在，用商品信息表库存 - 前端购物车传来的购买数量
            if (productInfo == null){
                throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
            }
            Integer restNum = productInfo.getProductStock() - cartDTO.getProductQuantity();
            if(restNum < 0){
                throw new SellException(ResultEnum.PRODUCT_STOCL_ERROR);
            }
            //3. 改变产品信息表的库存数量，存到产品信息表
            productInfo.setProductStock(restNum);

            //4.将这个产品信息表整体存到数据库中
            repository.save(productInfo);

        }
    }


}
